import {DynamicFormProps, FormSetPropsType} from '@/types/form';
import {DialogConfig} from '@/types/dialog';
import UseForm from '@/hooks/web/useForm';
import UseDialog from '@/hooks/web/useDialog';
import UseTable from '@/hooks/web/useTable';
import {SlTableProps, TableRowData} from '@/types/table';
import React from "react";
import {ComponentMethods} from "@/types/app.ts";

export interface ValidateConfig {
    // 5.5.0 新增。仅校验内容而不会将错误信息展示到 UI 上。
    validateOnly?: boolean;
    // 5.9.0 新增。对提供的 `nameList` 与其子路径进行递归校验。
    recursive?: boolean;
    // 5.11.0 新增。校验 dirty 的字段（touched + validated）。
    // 使用 `dirty` 可以很方便的仅校验用户操作过和被校验过的字段。
    dirty?: boolean;
}

export interface CountTableHeightProps {
    /**
     * 非必填，计算表格高度时，表格父级的ref名称，默认是contentRef, 多个可以传数组，如["contentRef", "contentRef1"]
     * 当此字段为数组时，请将tableRef也写成数组和contentRef一一对应
     */
    contentRef: React.Ref<any> | React.Ref<any>[];
    /**
     * 非必填，计算表格高度时，表格的ref名称，默认是tableRef, 多个可以传数组，如["tableRef", "tableRef1"]
     * 可以实现1、一对一计算，2、一对多计算，3、多对多计算
     * 1、contentRef和tableRef未传值或者contentRef和tableRef均为字符串时，此时为一对一计算方式
     * 2、当此字段为数组且contentRef字段为字符串时，此时为一个contentRef对应多个tableRef计算方式
     * 3、当此字段为数组且contentRef字段也为数组时，将tableRef也和contentRef一一对应，即可处理同页面下不同content下多个表格的高度计算，此为多对多计算方式
     */
    tableRef?: React.Ref<any> | React.Ref<any>[];
    /**
     * 非必填，计算表格高度时，表格的ref名称，默认是tableHeight, 多个可以传数组，如["tableHeight", "tableHeight1"]
     * 可以实现1、一对一计算，2、一对多计算，3、多对多计算
     * 1、contentRef和tableHeight未传值或者contentRef和tableHeight均为字符串时，此时为一对一计算方式
     * 2、当此字段为数组且contentRef字段为字符串时，此时为一个contentRef对应多个tableHeight计算方式
     * 3、当此字段为数组且contentRef字段也为数组时，将tableHeight也和contentRef一一对应，即可处理同页面下不同content下多个表格的高度计算，此为多对多计算方式
     */
    tableHeight?: string | string[];
}

export default function useRenderCom() {
    const getFormValue = (ref: any) => {
        return ref?.getFieldsValue();
    };
    const setFormValue = (ref: any, list: any) => {
        ref?.setValue(list);
    };

    const resetFormValue = (ref: any) => {
        ref?.resetFields();
    };
    /**
     * 校验表单是否填写所有的必填，然后再回调
     * @param ref
     * @param data
     */
    const setFormSchema = (ref: any, data: FormSetPropsType[]) => {
        return ref?.setSchema(data);
    };

    /**
     * 校验表单是否填写所有的必填，然后再回调
     * @param ref
     * @param options 对应form的ref字段，用于获取dom
     */
    const checkFormRequire = (ref: any, options?: ValidateConfig): Promise<any> => {
        return ref?.validateFields(options);
    };

    /**
     * 校验表单是否填写所有的必填，然后再回调
     * @param forms 对应form的ref字段集合，如：["filterRef", "filterRef2"]
     * @param callback 回调方法，携带forms对应的的所有表单数据
     * @param options
     */
    const batchCheckFormRequire = ({forms, callback, options}: {
        forms: any[],
        callback: (result: any) => void,
        options: any
    }) => {
        const requests: any[] = [];
        for (const form of forms) {
            requests.push(checkFormRequire(form, options));
        }
        Promise.all(requests).then((result: any) => {
            const successForms = result.filter((ele: any) => ele);
            if (successForms.length === forms.length) {
                callback && callback(result);
            }
        })
    };

    const renderForm = (options: DynamicFormProps & { ref?: React.Ref<any> }) => UseForm(options);
    const renderDialog = (options: DialogConfig) => UseDialog(options);

    const renderTable = <T extends TableRowData>(options: SlTableProps<T>) => UseTable(options);

    /**
     * 动态处理表格高度
     * @param tableRefList
     */
    const dealContentTableHeight = () => {

    }

    return {
        getFormValue,
        setFormValue,
        resetFormValue,
        setFormSchema,
        checkFormRequire,
        renderForm,
        renderDialog,
        renderTable,
    };
}
